package com.wx.gof.pattern.structural.flyweight;

/**
 * @ClassName Application
 * @Author wx
 * @Description
 * 定义:
 * 提供了减少对象数量从而改善应用所需的对象结构的方式（共享对象）
 * 描述:
 * 减少创建对象的数量，从而减少内存的占用，提高性能，避免重新创建
 * 使用场景:
 * 1.应用于系统底层的开发，以便解决系统的性能问题，比如String，如果有就从常量池中获取，没有就新建一个并存放常量池
 * 2.系统有大量相似的对象，需要缓存池的场景,比如数据库连接池、线程连接池
 * 优点:
 * 1.减少对象的创建，降低内存中对象的数量，降低系统的内存，提高效率
 * 2.减少内存之外的其他资源占用，比如new对象需要时间，减少这种时间资源
 * 缺点:
 * 1.使得系统更加复杂。为了使对象可以共享，需要将一些状态外部化，这使得程序的逻辑复杂化
 * 2.关注线程安全问题
 * 理解:
 * 应用程序-享元模式(适用相似对象的复用场景，减少使用对象数量提高性能，一般用于底层开发解决系统性能问题，比如连接池)
*  外部状态-可变
*  内部状态-不可变
*  比如我有5条连接对象，这5条连接对象是相似的，如果我还继续要用这5条连接对象，就会又重新创建出5条新的连接对象
*  此时可以使用享元模式，把这5条连接对象以K-V的形式缓存起来，下次使用的时候根据key(外部状态)重复使用之前创建好的
*  连接对象，连接对象内部一些固定的属性内容则是内部状态
 * @Date 2018-12-08-23:45
 */
public class Application {
    private static final String departments[] = {"RD","QA","PM","BD"};
    public static void main(String[] agrs){
        for(int i=0; i<10; i++){
            String department = departments[(int)(Math.random() * departments.length)];
            Manager manager = (Manager) EmployeeFactory.getManager(department);
            manager.report();
        }
    }
}
